package novel.manager.service.impl.spider;

import novel.manager.pojo.spider.NovelSiteEnum;
import novel.manager.pojo.spider.NovelSpiderHttpGet;
import novel.manager.service.utils.NovelSpiderUtil;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
//所有spider的父类
public abstract class AbstractSpider {
	/**
	 * 项目核心方法：抓取指定小说网站的整个页面所有内容
	 */
	//url：章节列表地址或章节内容地址
	protected String crawl(String url) throws Exception {
		/**HttpClient是Apache中的一个开源的项目。它实现了HTTP标准中Client端的所有功能，使用它能够很容易地进行HTTP信息的传输.
		 * 使用HttpClient请求一个Http请求的步骤为：
			（1）创建一个HttpClient对象
			（2）创建一个Request对象
			（3）使用HttpClient来执行Request请求，得到对方的response
			（4）处理response
			（5）关闭HttpClient*/
		//创建一个HttpClient对象
		try (CloseableHttpClient httpClient = HttpClientBuilder.create().build();			
		     //执行get请求,服务器在接收和解释请求之后返回一个HTTP响应信息  
			 //使用自定义的HttpGet的子类
			 CloseableHttpResponse httpResponse = httpClient.execute(new NovelSpiderHttpGet(url))) 
			{
            //获取响应消息实体  
            HttpEntity entity = httpResponse.getEntity();             
            //响应状态  
            System.out.println("status:" + httpResponse.getStatusLine());  
            //判断响应实体是否为空  
            String result=null; 
            if (entity != null) { 
            	String encoding=null;
                //拿到对应网站的解析规则的map形式，然后根据编码方式进行toString得到响应实体内容
            	//因为笔下文学的章节列表是UTF-8,章节内容是GBK，所以配置章节列表跟章节内容一致时charset：UTF-8，章节列表跟章节内容不一致时，章节列表为charset：UTF-8，章节内容为charset2：GBK
            	//如果是笔下文学的章节列表页面
            	if((url.endsWith(".html"))&&(url.contains("bxwx9.org"))){
            		encoding=NovelSpiderUtil.getSpiderRuleMapByNovelSiteEnum(NovelSiteEnum.getEnumByUrl(url)).get("charset2");
            	}else{ 
            		//其他页面
            		encoding=NovelSpiderUtil.getSpiderRuleMapByNovelSiteEnum(NovelSiteEnum.getEnumByUrl(url)).get("charset");
            	}
                System.out.println("encoding:"+encoding);
                //HttpEntity转String
                result = EntityUtils.toString(entity,encoding);
                System.out.println("result:"+result);
            } 
			return result;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}
